package com.java1412.task;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * @author java1412
 * @create 2021-07-20 15:27
 * 如果不添加@Async注解，默认是串行执行。
 * 如果只有一个定时任务，这样做肯定没问题，当定时任务增多，如果一个任务卡死，会导致其他任务页无法执行。
 * 当有多个任务的时候，可以使用Async注解进行异步执行。
 */
// @Component
@EnableScheduling
@Async
public class AlarmTask {
    /**
     * 默认是fixedDelay,上一次执行完毕时间后执行下一轮
     */
    @Scheduled(cron = "0/3 * * * * *")
    public void run1() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName() + "=====>>>>>使用cron  {}" + (System.currentTimeMillis() / 1000));
    }

    /**
     * fixedRate:上一次开始执行时间点之后5秒再执行
     */
    @Scheduled(fixedRate = 5000)
    public void run2() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println(Thread.currentThread().getName() + "=====>>>>>使用fixedRate  {}" + (System.currentTimeMillis() / 1000));
    }

    /**
     * fixedDelay:上一次执行完毕时间点之后5秒再执行
     */
    @Scheduled(fixedDelay = 5000)
    public void run3() throws InterruptedException {
        Thread.sleep(7000);
        System.out.println(Thread.currentThread().getName() + "=====>>>>>使用fixedDelay  {}" + (System.currentTimeMillis() / 1000));
    }

    /**
     * 第一次延迟2秒后执行，之后按fixedDelay的规则每5秒执行一次
     */
    @Scheduled(initialDelay = 2000, fixedDelay = 5000)
    public void run4() {
        System.out.println(Thread.currentThread().getName() + "=====>>>>>使用initialDelay  {}" + (System.currentTimeMillis() / 1000));
    }
}
